package com.java.al.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import jxl.Cell;
import jxl.Range;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
 * 运用 jxl.jar包操作 Excel
 * 执行对Excel文件的读写操作
 * 
 */
public class ExcelDemo {
	/**
	 * 读取 Excel
	 * @param file 欲读取的Excel文件的路径
	 * @return 
	 * @throws Exception
	 */
	public static String read(File file) throws Exception {
		StringBuffer sb = new StringBuffer();

		Workbook wb = null;
		try {
			// 获取工作簿对象
			wb = Workbook.getWorkbook(file);
			if (wb != null) {
				// 获取工作簿对象就可以获取工作簿内的工作表对象
				Sheet[] sheets = wb.getSheets();
				if (sheets != null && sheets.length != 0) {
					// 遍历工作簿内所有工作表
					for ( Sheet sheet : sheets) {
						// 获取该工作表内的行数
						int rows = sheet.getRows();
						// 遍历行
						for (int j = 0; j < rows; j++) {
							// 获取当前行的所有有单元格
							Cell[] cells = sheet.getRow(j);
							if (cells != null && cells.length != 0) {
								// 遍历单元格
								for (int k = 0; k < cells.length; k++) {
									// 获取当前单元格的内容
									String cell = cells[k].getContents();
									// 缩进
									sb.append(cell + "\t");
								}
								sb.append("\t\n");
							}
						}
						sb.append("\t\n");
					}
				}
				System.out.println("成功读取了：" + file + "\n");
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			wb.close();
		}
		return sb.toString();
	}

	/**
	 * 写
	 * 
	 * @param fileName
	 *            被写入的Excel文件的路径
	 * @param sheetName
	 *            被写入的Excel文件的工作表
	 * @param location
	 *            被写入的Excel文件的工作表位于工作簿的位置
	 * @throws Exception
	 */
	public static void write(String fileName, String sheetName, int location)
			throws Exception {
		OutputStream os=new FileOutputStream(fileName);//输出的Excel文件URL
	    WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作�?
		Label label = null;

		try {
			// 创建可写入的工作簿对象
			wwb = Workbook.createWorkbook(new File(fileName));
			if (wwb != null) {
				// 在工作簿里创建可写入的工作表，第�?个参数为工作表名，第二个参数为该工作表的�?在位�?
				WritableSheet ws = wwb.createSheet(sheetName, location);
				if (ws != null) {
					/* 添加表结构 */
					// �?
					for (int i = 0; i < 5; i++) {
						// �?
						for (int j = 0; j < 5; j++) {
							String out = "第" + (i + 1) + "行，" + "第"+ (j + 1) + "列";
							if((j==0&&i==0||(j==1&&i==1))) out = String.valueOf(i*15);
							// Label构造器中有三个参数，第一个为列，第二个为行，第三个则为单元格填充的内容
							label = new Label(j, i, out);
							// 将被写入数据的单元格添加到工作表
							ws.addCell(label);
						}
					}
					NumberFormat dp3 = new NumberFormat("#.###"); //设置单元格里面的数字格式
				    WritableCellFormat dp3cell = new WritableCellFormat(dp3);
				    dp3cell.setWrap(true);

					Formula f = new Formula(2,3, "(a1+b2)/2", dp3cell); 
					ws.addCell(f);
					// 从内存中写入到文件
					wwb.write();
				}
				System.out.println("路径为：" + fileName + "的工作簿写入数据成功�?");
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			wwb.close();
		}
	}

	public static void readExcel(String filepath){ 
		try { 
		InputStream is = new FileInputStream(filepath); 
		Workbook wb = Workbook.getWorkbook(is); 
		int sheet_size = wb.getNumberOfSheets(); 
		for(int index = 0; index < sheet_size ; index++){ 
		Sheet sheet = wb.getSheet(index); 
		Range[] ranges = sheet.getMergedCells(); 
		    System.out.println("sheet" + index + "包含" + ranges.length + "个区域"); 
		    for(Range space:ranges){ 
		    System.out.print(space.getTopLeft().getRow()+1+"行,"); 
		    System.out.print(space.getTopLeft().getColumn()+1+"列\t"); 
		    System.out.print(space.getBottomRight().getRow()+1+"行,"); 
		    System.out.print(space.getBottomRight().getColumn()+1+"列\n"); 
		    } 
		} 
		} catch (FileNotFoundException e) { 
		e.printStackTrace(); 
		} catch (BiffException e) { 
		e.printStackTrace(); 
		} catch (IOException e) { 
		e.printStackTrace(); 
		} 
		} 

	public static void main(String[] args) {
		/* 测试读取(注意：文件路径中的盘符D:/，注意斜杠不要写成反斜杠"\") */
		// 如果不存在该文件，返回空并抛出异�?
		/*
		 * File file = new File("D:/testRead.xls"); try {
		 * System.out.println(read(file)); } catch (Exception e) {
		 * System.out.println(e.getMessage()); }
		 */
		/* 测试写入(注意：如果进程中正在运行被写入的文件，将抛出异常) */
//		try {
//			// 如果不存在该文件，程序将新建�?个同名文�?
//			write("D:/testWrite.xls", "Sheet1", 0);
//		} catch (Exception e) {
//			System.out.println(e.getMessage());
//		}
		
		readExcel("D:/WorkSoft/eclipseWorkSpace/simpleJAVA/src/com/al/excel/date.xls");
	}
}